<?php
namespace Swiftx\Interfaces\Orm;
/**
 * 实体管理器
 * @package Swiftx\Interfaces\Orm
 * @default-implement Swiftx\Component\Orm\Manager singleton=true
 */
interface Manager {

    /**
     * 连接数据库系统
     * @param string $type
     * @param string $host
     * @param string $name
     * @param string|null $username
     * @param string|null $password
     */
    public function connection(string $type, string $host, string $name, string $username = null, string $password = null);

    /**
     * 设置运行时目录
     * @param string $path
     */
    public function setRuntimeDir(string $path);

    /**
     * 设置映射数据表
     * @param string $interface
     * @param string $table
     */
    public function setMappingTable(string $interface, string $table);

    /**
     * 注册映射配置文件
     * @param string $path
     */
    public function registerMappingConfig(string $path);

    /**
     * 获取实体
     * @param string $entity
     * @param array ...$keys
     * @return Entity
     */
    public function fetch(string $entity, ... $keys):?Entity;

    /**
     * 获取查询器
     * @param string $entity
     * @param string $name
     * @return Query
     */
    public function query(string $entity, string $name):Query;

    /**
     * 获取工厂基础实例
     * @param string $entity
     * @return Factory
     */
    public function simpleFactory(string $entity):Factory;

    /**
     * 获取构造器实例
     * @param string $entity
     * @return Builder
     */
    public function builder(string $entity):Builder;

    /**
     * 存储实体
     * @param Entity $object
     */
    public function save(Entity $object);

    /**
     * 刷新生效
     * @param bool $transaction
     */
    public function flush(bool $transaction=false);

    /**
     * 查看表名称
     * @param string $class
     * @return string
     */
    public function translateTableName(string $class):string ;

    /**
     * 查看表字段
     * @param string $class
     * @param string $prototype
     * @return string
     */
    public function translateTableField(string $class, string $prototype):string ;

    /**
     * 从数组数据构建对象
     * @param string $class
     * @param array $data
     * @return Entity
     */
    public function buildEntity(string $class, array $data):Entity;

    /**
     * 构建数据库结构
     */
    public function buildSchemas();

}